﻿Imports Mystery

Public Class RefecenceAsText
    Implements IPropertyControl


    Private _property_info As System.Reflection.PropertyInfo
    Private _content_property As ContentReference


    Public Property property_info As System.Reflection.PropertyInfo Implements IPropertyControl.property_info
        Get
            Return _property_info
        End Get
        Set(value As System.Reflection.PropertyInfo)
            _content_property = value.getMysteryAttribute(Of ContentReference)()
            _label = _content_property.label
            _property_info = value
        End Set
    End Property

    Private _value As ICollection(Of IContent) = New List(Of IContent)

    Public Property value As Object Implements IPropertyControl.value
        Get
            Return _value
        End Get
        Set(value As Object)
            If TypeOf (value) Is BaseContentReference Then value = DirectCast(value, BaseContentReference).getAsEnum()
            If TypeOf (value) Is IContent Then value = New List(Of IContent) From {value}
            Dim new_value As IEnumerable(Of IContent) = value
            If new_value.sameContents(_value) Then Exit Property

            _value = New List(Of IContent)(new_value)

            Dim ref_texts As New List(Of String)(_value.Count)
            For Each c As IContent In _value
                Dim refText As ReferenceText = c.GetType.getFirstAttribute(Of ReferenceText)()
                ref_texts.Add(refText.getReferenceText(c))
            Next

            refText.Content = String.Join(", ", ref_texts.ToArray)

            RaiseEvent valueChanged()
        End Set
    End Property

    Private _content As IContent

    Public Property content_item As Mystery.IContent Implements IPropertyControl.content
        Get
            Return _content
        End Get
        Set(value As Mystery.IContent)
            _content = value
            Me.value = _content_property.retrive()(_content)
        End Set
    End Property


    Private _label As String
    Public ReadOnly Property label As String Implements IPropertyControl.label
        Get
            Return _label
        End Get
    End Property


    Public ReadOnly Property wished_height As System.Windows.GridLength Implements IPropertyControl.wished_height
        Get
            Return GridLength.Auto
        End Get
    End Property

    Public Function setInContent() As IEnumerable(Of IContent) Implements IPropertyControl.setInContent
        Dim pv As BaseContentReference = _content_property.retrive()(_content)
        pv.setWithEnum(_value)
        Return New List(Of IContent) From {_content}
    End Function

    Public Event valueChanged() Implements IPropertyControl.valueChanged

End Class
